PĂ”hjalik juhend JavaScripti turvalisuse parimate tavade kohta arendajatele ĂŒle maailma, mis hĂ”lmab levinumaid haavatavusi ja tĂ”husaid ennetusstrateegiaid.
JavaScripti turvalisuse parimate tavade juhend: haavatavuste ennetamise strateegiad
JavaScript, olles kaasaegsete veebirakenduste selgroog, nÔuab hoolikat tÀhelepanu turvalisusele. Selle laialdane kasutus nii esiotsa kui ka tagaotsa keskkondades (Node.js) muudab selle pahatahtlike osalejate peamiseks sihtmÀrgiks. See pÔhjalik juhend kirjeldab olulisi JavaScripti turvalisuse parimaid tavasid, et leevendada levinud haavatavusi ja tugevdada teie rakendusi arenevate ohtude vastu. Need strateegiad on rakendatavad globaalselt, sÔltumata teie konkreetsest arenduskeskkonnast vÔi piirkonnast.
Levinud JavaScripti haavatavuste mÔistmine
Enne ennetustehnikatesse sĂŒvenemist on oluline mĂ”ista kĂ”ige levinumaid JavaScripti haavatavusi:
- SaidideĂŒlene skriptimine (XSS): Pahatahtlike skriptide sĂŒstimine usaldusvÀÀrsetesse veebisaitidesse, mis vĂ”imaldab rĂŒndajatel kĂ€ivitada suvalist koodi kasutaja brauseris.
- SaidideĂŒlene pĂ€ringu vĂ”ltsimine (CSRF): Kasutajate petmine sooritama toiminguid, mida nad ei kavatsenud, sageli autenditud seansse Ă€ra kasutades.
- SĂŒstimisrĂŒnnakud: Pahatahtliku koodi sĂŒstimine serveripoolsetesse JavaScripti rakendustesse (nt Node.js) kasutaja sisendite kaudu, mis viib andmeleketeni vĂ”i sĂŒsteemi kompromiteerimiseni.
- Autentimis- ja autoriseerimisvead: NÔrgad vÔi valesti rakendatud autentimis- ja autoriseerimismehhanismid, mis annavad volitamata juurdepÀÀsu tundlikele andmetele vÔi funktsionaalsusele.
- Tundlike andmete paljastamine: Tundliku teabe (nt API-vÔtmed, paroolid) tahtmatu paljastamine kliendipoolses koodis vÔi serveripoolsetes logides.
- SÔltuvuste haavatavused: Aegunud vÔi haavatavate kolmandate osapoolte teekide ja raamistike kasutamine.
- TeenusetĂ”kestamise rĂŒnne (DoS): Serveri ressursside kurnamine, et muuta teenus seaduslikele kasutajatele kĂ€ttesaamatuks.
- Klikikaaperdamine (Clickjacking): Kasutajate petmine klikkima peidetud vÔi maskeeritud elementidele, mis viib soovimatute toiminguteni.
Esiotsa turvalisuse parimad tavad
Esiots, olles otse kasutajatele avatud, nĂ”uab tugevaid turvameetmeid kliendipoolsete rĂŒnnakute vĂ€ltimiseks.
1. SaidideĂŒlese skriptimise (XSS) ennetamine
XSS on ĂŒks levinumaid ja ohtlikumaid veebihaavatavusi. Siin on, kuidas seda ennetada:
- Sisendi valideerimine ja puhastamine:
- Serveripoolne valideerimine: Valideerige ja puhastage alati kasutaja sisendeid serveris *enne* nende andmebaasi salvestamist vÔi brauseris renderdamist. See on teie esimene kaitseliin.
- Kliendipoolne valideerimine: Kuigi see ei asenda serveripoolset valideerimist, vÔib kliendipoolne valideerimine pakkuda kasutajatele kohest tagasisidet ja vÀhendada tarbetuid serveripÀringuid. Kasutage seda andmete vormingu valideerimiseks (nt e-posti aadressi formaat), kuid *Àrge kunagi* usaldage seda turvalisuse osas.
- VÀljundi kodeerimine: Kodeerige andmed Ôigesti, kui neid brauseris kuvate. Kasutage HTML-olemite kodeerimist, et vÀltida mÀrke, millel on HTML-is eriline tÀhendus (nt
<asemel <,>asemel >,&asemel &). - Sisu turvapoliitika (CSP): Rakendage CSP, et kontrollida ressursse (nt skriptid, stiililehed, pildid), mida brauseril on lubatud laadida. See vĂ€hendab oluliselt XSS-rĂŒnnakute mĂ”ju, takistades volitamata skriptide kĂ€ivitamist.
- Kasutage turvalisi mallimootoreid: Mallimootorid nagu Handlebars.js vÔi Vue.js pakuvad sisseehitatud mehhanisme kasutaja sisestatud andmete vÀltimiseks, vÀhendades XSS-i riski.
- VĂ€ltige
eval()kasutamist: Funktsiooneval()kÀivitab suvalist koodi, mis muudab selle suureks turvariskiks. VÀltige seda alati, kui vÔimalik. Kui peate seda kasutama, veenduge, et sisend on rangelt kontrollitud ja puhastatud. - HTML-olemite vÀltimine: Teisendage erimÀrgid nagu
<,>,&,"ja'nende vastavateks HTML-olemiteks, et vÀltida nende tÔlgendamist HTML-koodina.
NĂ€ide (JavaScript):
function escapeHtml(unsafe) {
return unsafe
.replace(/&/g, "&")
.replace(//g, ">")
.replace(/"/g, """)
.replace(/'/g, "'");
}
const userInput = "";
const escapedInput = escapeHtml(userInput);
console.log(escapedInput); // VĂ€ljund: <script>alert('XSS');</script>
// Kasutage puhastatud sisendit kasutaja sisendi kuvamisel brauseris.
document.getElementById('output').textContent = escapedInput;
NĂ€ide (Sisu turvapoliitika):
Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline' https://trusted-cdn.example.com; style-src 'self' https://trusted-cdn.example.com; img-src 'self' data:;
See CSP direktiiv lubab skripte samast pĂ€ritolust ('self'), tekstisiseseid skripte ('unsafe-inline') ja skripte aadressilt https://trusted-cdn.example.com. See piirab teisi allikaid, takistades rĂŒndaja poolt sĂŒstitud volitamata skriptide kĂ€ivitamist.
2. SaidideĂŒlese pĂ€ringu vĂ”ltsimise (CSRF) ennetamine
CSRF-rĂŒnded petavad kasutajaid sooritama toiminguid ilma nende teadmata. Siin on, kuidas end nende eest kaitsta:
- CSRF-tokenid: Genereerige iga kasutajaseansi jaoks unikaalne, ettearvamatu token ja lisage see kÔikidesse olekut muutvatesse pÀringutesse (nt vormide esitamised, API-kÔned). Server kontrollib tokenit enne pÀringu töötlemist.
- SameSite kĂŒpsised: Kasutage kĂŒpsiste jaoks atribuuti
SameSite, et kontrollida, millal kĂŒpsised saadetakse saitideĂŒleste pĂ€ringutega.SameSite=Strictseadistamine takistab kĂŒpsise saatmist saitideĂŒleste pĂ€ringutega, leevendades CSRF-rĂŒnnakuid.SameSite=Laxlubab kĂŒpsise saata tipptaseme GET-pĂ€ringutega, mis navigeerivad kasutaja pĂ€ritolusaidile. - Topelt-esitamise kĂŒpsised: Seadistage kĂŒpsisesse juhuslik vÀÀrtus ja lisage see ka peidetud vormivĂ€ljale. Server kontrollib enne pĂ€ringu töötlemist, et mĂ”lemad vÀÀrtused ĂŒhtivad. See on vĂ€hem levinud lĂ€henemine kui CSRF-tokenid.
NĂ€ide (CSRF-tokeni genereerimine - serveripoolne):
const crypto = require('crypto');
function generateCsrfToken() {
return crypto.randomBytes(32).toString('hex');
}
// Salvestage token kasutaja seanssi.
req.session.csrfToken = generateCsrfToken();
// Lisage token peidetud vormivÀljale vÔi AJAX-pÀringute pÀisesse.
NĂ€ide (CSRF-tokeni kontrollimine - serveripoolne):
// Kontrollige pÀringust saadud tokenit seansis salvestatud tokeniga.
if (req.body.csrfToken !== req.session.csrfToken) {
return res.status(403).send('CSRF token mismatch');
}
3. Turvaline autentimine ja autoriseerimine
Tugevad autentimis- ja autoriseerimismehhanismid on tundlike andmete ja funktsionaalsuse kaitsmiseks ĂŒliolulised.
- Kasutage tugevaid paroole: Kehtestage tugevad paroolipoliitikad (nt minimaalne pikkus, keerukuse nÔuded).
- Rakendage mitmefaktorilist autentimist (MFA): NÔudke kasutajatelt mitut autentimisvormi (nt parool ja kood mobiilirakendusest), et suurendada turvalisust. MFA on laialdaselt kasutusel kogu maailmas.
- Hoidke paroole turvaliselt: Ărge kunagi salvestage paroole lihttekstina. Kasutage paroolide rĂ€simiseks enne andmebaasi salvestamist tugevaid rĂ€sialgoritme nagu bcrypt vĂ”i Argon2. Lisage sool vikerkaare tabeli rĂŒnnakute vĂ€ltimiseks.
- Rakendage korrektne autoriseerimine: Kontrollige juurdepÀÀsu ressurssidele kasutaja rollide ja lubade alusel. Veenduge, et kasutajatel on juurdepÀÀs ainult neile vajalikele andmetele ja funktsionaalsusele.
- Kasutage HTTPS-i: KrĂŒpteerige kogu suhtlus kliendi ja serveri vahel HTTPS-iga, et kaitsta edastatavaid tundlikke andmeid.
- NÔuetekohane seansihaldus: Rakendage turvalisi seansihaldustavasid, sealhulgas:
- SeansikĂŒpsise atribuutide (nt
HttpOnly,Secure,SameSite) Ôige seadistamine. - Tugevate seansi ID-de kasutamine.
- Seansi ID-de regenereerimine pÀrast sisselogimist.
- Seansi ajalÔppude rakendamine.
- Seansside kehtetuks tunnistamine vÀljalogimisel.
- SeansikĂŒpsise atribuutide (nt
NÀide (Parooli rÀsimine bcryptiga):
const bcrypt = require('bcrypt');
async function hashPassword(password) {
const saltRounds = 10; // Kohandage soolaraundide arvu jÔudluse ja turvalisuse kompromissi jaoks.
const hashedPassword = await bcrypt.hash(password, saltRounds);
return hashedPassword;
}
async function comparePassword(password, hashedPassword) {
const match = await bcrypt.compare(password, hashedPassword);
return match;
}
4. Tundlike andmete kaitsmine
VÀltige tundlike andmete juhuslikku vÔi tahtlikku paljastamist.
- VĂ€ltige tundlike andmete hoidmist kliendi poolel: Minimeerige brauseris hoitavate tundlike andmete hulka. Vajadusel krĂŒpteerige andmed enne nende salvestamist.
- Puhastage andmed enne kuvamist: Puhastage andmed enne nende brauseris kuvamist, et vĂ€ltida XSS-rĂŒnnakuid ja muid haavatavusi.
- Kasutage HTTPS-i: Kasutage alati HTTPS-i andmete krĂŒpteerimiseks kliendi ja serveri vahelisel edastusel.
- Kaitske API-vÔtmeid: Hoidke API-vÔtmeid turvaliselt ja vÀltige nende paljastamist kliendipoolses koodis. Kasutage API-vÔtmete haldamiseks keskkonnamuutujaid ja serveripoolseid proksisid.
- Vaadake koodi regulaarselt ĂŒle: Viige lĂ€bi pĂ”hjalikke koodiĂŒlevaatusi, et tuvastada potentsiaalseid turvaauke ja andmete paljastamise riske.
5. SÔltuvuste haldamine
Kolmandate osapoolte teegid ja raamistikud vÔivad tuua kaasa haavatavusi. SÔltuvuste tÔhus haldamine on hÀdavajalik.
- Hoidke sÔltuvused ajakohased: Uuendage regulaarselt oma sÔltuvusi uusimatele versioonidele, et paigata teadaolevaid haavatavusi.
- Kasutage sÔltuvuste haldamise tööriista: Kasutage oma sÔltuvuste haldamiseks ja nende versioonide jÀlgimiseks tööriistu nagu npm, yarn vÔi pnpm.
- Auditeerige sÔltuvusi haavatavuste suhtes: Kasutage oma sÔltuvuste skannimiseks teadaolevate haavatavuste suhtes tööriistu nagu
npm auditvÔiyarn audit. - Arvestage tarneahelaga: Olge teadlik turvariskidest, mis on seotud teie sÔltuvuste sÔltuvustega (transitiivsed sÔltuvused).
- Kinnitage sÔltuvuste versioonid: Kasutage konkreetseid versiooninumbreid (nt
1.2.3) versioonivahemike (nt^1.2.3) asemel, et tagada jÀrjepidevad ehitused ja vÀltida ootamatuid uuendusi, mis vÔivad tuua kaasa haavatavusi.
Tagaotsa (Node.js) turvalisuse parimad tavad
Node.js rakendused on samuti haavatavad erinevate rĂŒnnakute suhtes, mis nĂ”uab hoolikat tĂ€helepanu turvalisusele.
1. SĂŒstimisrĂŒnnakute ennetamine
SĂŒstimisrĂŒnded kasutavad Ă€ra haavatavusi selles, kuidas rakendused kĂ€sitlevad kasutaja sisendit, vĂ”imaldades rĂŒndajatel sĂŒstida pahatahtlikku koodi.
- SQL-sĂŒstimine: Kasutage SQL-sĂŒstimise rĂŒnnakute vĂ€ltimiseks parameetritega pĂ€ringuid vĂ”i objekt-relatsioonilisi kaardistajaid (ORM). Parameetritega pĂ€ringud kĂ€sitlevad kasutaja sisendit andmetena, mitte kĂ€ivitatava koodina.
- KĂ€skude sĂŒstimine: VĂ€ltige
exec()vĂ”ispawn()kasutamist shellikĂ€skude kĂ€ivitamiseks kasutaja sisestatud andmetega. Kui peate neid kasutama, puhastage sisend hoolikalt, et vĂ€ltida kĂ€skude sĂŒstimist. - LDAP-sĂŒstimine: Puhastage kasutaja sisend enne selle kasutamist LDAP-pĂ€ringutes, et vĂ€ltida LDAP-sĂŒstimise rĂŒnnakuid.
- NoSQL-sĂŒstimine: Kasutage NoSQL-andmebaasidega korrektseid pĂ€ringute koostamise tehnikaid, et vĂ€ltida NoSQL-sĂŒstimise rĂŒnnakuid.
NĂ€ide (SQL-sĂŒstimise ennetamine parameetritega pĂ€ringutega):
const mysql = require('mysql');
const connection = mysql.createConnection({
host: 'localhost',
user: 'user',
password: 'password',
database: 'database'
});
const userId = req.params.id; // Kasutaja sisestatud andmed
// Kasutage parameetritega pĂ€ringut SQL-sĂŒstimise vĂ€ltimiseks.
connection.query('SELECT * FROM users WHERE id = ?', [userId], (error, results, fields) => {
if (error) {
console.error(error);
return res.status(500).send('Internal Server Error');
}
res.json(results);
});
2. Sisendi valideerimine ja puhastamine (serveripoolne)
Valideerige ja puhastage alati kasutaja sisendeid serveris, et vĂ€ltida erinevat tĂŒĂŒpi rĂŒnnakuid.
- Valideerige andmetĂŒĂŒpe: Veenduge, et kasutaja sisend vastab oodatud andmetĂŒĂŒbile (nt number, string, e-post).
- Puhastage andmed: Eemaldage vÔi vÀltige potentsiaalselt pahatahtlikke mÀrke kasutaja sisendist. Kasutage sisendi puhastamiseks teeke nagu
validator.jsvĂ”iDOMPurify. - Piirake sisendi pikkust: Piirake kasutaja sisendi pikkust, et vĂ€ltida puhvri ĂŒletĂ€itumise rĂŒnnakuid ja muid probleeme.
- Kasutage regulaaravaldisi: Kasutage regulaaravaldisi kasutaja sisendi valideerimiseks ja puhastamiseks kindlate mustrite alusel.
3. VeakÀsitlus ja logimine
NÔuetekohane veakÀsitlus ja logimine on turvaaukude tuvastamiseks ja nendega tegelemiseks hÀdavajalikud.
- KĂ€sitlege vigu sujuvalt: VĂ€ltige, et veateated paljastaksid tundlikku teavet teie rakenduse kohta.
- Logige vigu ja turvasĂŒndmusi: Logige vigu, turvasĂŒndmusi ja kahtlast tegevust, et aidata teil turvaintsidente tuvastada ja neile reageerida.
- Kasutage tsentraliseeritud logimissĂŒsteemi: Kasutage tsentraliseeritud logimissĂŒsteemi, et koguda ja analĂŒĂŒsida logisid mitmest serverist ja rakendusest.
- JĂ€lgige logisid regulaarselt: JĂ€lgige regulaarselt oma logisid kahtlase tegevuse ja turvaaukude suhtes.
4. TurvapÀised
TurvapĂ€ised pakuvad tĂ€iendavat kaitsekihti erinevate rĂŒnnakute vastu.
- Sisu turvapoliitika (CSP): Nagu varem mainitud, kontrollib CSP ressursse, mida brauseril on lubatud laadida.
- HTTP Strict Transport Security (HSTS): Sunnib brausereid kasutama HTTPS-i kogu suhtluseks teie veebisaidiga.
- X-Frame-Options: Hoiab Ă€ra klikikaaperdamise rĂŒnnakud, kontrollides, kas teie veebisaiti saab iframe'is kuvada.
- X-XSS-Protection: LĂŒlitab sisse brauseri sisseehitatud XSS-filtri.
- X-Content-Type-Options: Hoiab Ă€ra MIME-nuuskimise rĂŒnnakud.
- Referrer-Policy: Kontrollib pÀringutega saadetava viiteteabe hulka.
NÀide (TurvapÀiste seadistamine Node.js-is Expressiga):
const express = require('express');
const helmet = require('helmet');
const app = express();
// Kasutage Helmetit turvapÀiste seadistamiseks.
app.use(helmet());
// Kohandage CSP-d (nÀide).
app.use(helmet.contentSecurityPolicy({
directives: {
defaultSrc: ["'self'"],
scriptSrc: ["'self'", "https://trusted-cdn.example.com"]
}
}));
app.get('/', (req, res) => {
res.send('Hello World!');
});
app.listen(3000, () => {
console.log('Server listening on port 3000');
});
5. PĂ€ringute piiramine (Rate Limiting)
Rakendage pĂ€ringute piiramist, et vĂ€ltida teenusetĂ”kestamise (DoS) rĂŒnnakuid ja toore jĂ”u rĂŒnnakuid.
- Piirake pÀringute arvu: Piirake pÀringute arvu, mida kasutaja saab teatud aja jooksul teha.
- Kasutage pÀringute piiramise vahevara: Kasutage pÀringute piiramise rakendamiseks vahevara nagu
express-rate-limit. - Kohandage pĂ€ringute piiranguid: Kohandage pĂ€ringute piiranguid vastavalt pĂ€ringu tĂŒĂŒbile ja kasutaja rollile.
NĂ€ide (PĂ€ringute piiramine Express Rate Limitiga):
const express = require('express');
const rateLimit = require('express-rate-limit');
const app = express();
const limiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15 minutit
max: 100, // Piira iga IP 100 pÀringuga akna (windowMs) kohta
message:
'Liiga palju pÀringuid sellelt IP-lt, palun proovige uuesti 15 minuti pÀrast'
});
// Rakenda pÀringute piiramise vahevara kÔikidele pÀringutele.
app.use(limiter);
app.get('/', (req, res) => {
res.send('Hello World!');
});
app.listen(3000, () => {
console.log('Server listening on port 3000');
});
6. Protsessihaldus ja turvalisus
NÔuetekohane protsessihaldus vÔib parandada teie Node.js rakenduste turvalisust ja stabiilsust.
- KĂ€ivitage mitte-privilegeeritud kasutajana: KĂ€ivitage oma Node.js rakendused mitte-privilegeeritud kasutajana, et piirata turvaaukudest tulenevat potentsiaalset kahju.
- Kasutage protsessihaldurit: Kasutage protsessihaldurit nagu PM2 vÔi Nodemon, et rakendus automaatselt taaskÀivitada, kui see kokku jookseb, ja jÀlgida selle jÔudlust.
- Piirake ressursside tarbimist: Piirake ressursside (nt mĂ€lu, protsessor) hulka, mida teie rakendus saab tarbida, et vĂ€ltida teenusetĂ”kestamise rĂŒnnakuid.
Ăldised turvatavad
Need tavad on rakendatavad nii esiotsa kui ka tagaotsa JavaScripti arenduses.
1. Koodi ĂŒlevaatus
Viige lĂ€bi pĂ”hjalikke koodiĂŒlevaatusi, et tuvastada potentsiaalseid turvaauke ja kodeerimisvigu. Kaasake ĂŒlevaatusprotsessi mitu arendajat.
2. Turvatestimine
Tehke regulaarselt turvateste haavatavuste tuvastamiseks ja nendega tegelemiseks. Kasutage kombinatsiooni manuaalsetest ja automatiseeritud testimistehnikatest.
- Staatilise analĂŒĂŒsi turvatestimine (SAST): AnalĂŒĂŒsige lĂ€htekoodi potentsiaalsete haavatavuste tuvastamiseks.
- DĂŒnaamilise analĂŒĂŒsi turvatestimine (DAST): Testige töötavaid rakendusi haavatavuste tuvastamiseks.
- LĂ€bivustestimine: Simuleerige reaalseid rĂŒnnakuid, et tuvastada haavatavusi ja hinnata oma rakenduse turvaasendit.
- HÀgus testimine (Fuzzing): Sisestage arvutiprogrammi sisendina kehtetuid, ootamatuid vÔi juhuslikke andmeid.
3. Turvateadlikkuse koolitus
Pakkuge kÔikidele arendajatele turvateadlikkuse koolitust, et harida neid levinud turvaaukude ja parimate tavade osas. Hoidke koolitus ajakohasena uusimate ohtude ja suundumustega.
4. Intsidentidele reageerimise plaan
Töötage vÀlja intsidentidele reageerimise plaan, et suunata oma tegevust turvaintsidentide korral. Plaan peaks sisaldama protseduure turvaintsidentide tuvastamiseks, piiramiseks, likvideerimiseks ja nendest taastumiseks.
5. PĂŒsige kursis
PĂŒsige kursis uusimate turvaohtude ja haavatavustega. Tellige turvalisuse meililiste, jĂ€lgige turvauurijaid ja osalege turvakonverentsidel.
KokkuvÔte
JavaScripti turvalisus on pidev protsess, mis nĂ”uab valvsust ja proaktiivset lĂ€henemist. Nende parimate tavade rakendamise ja uusimate ohtudega kursis olemise kaudu saate oluliselt vĂ€hendada turvaaukude riski ning kaitsta oma rakendusi ja kasutajaid. Pidage meeles, et turvalisus on jagatud vastutus ning kĂ”ik arendusprotsessis osalejad peaksid olema teadlikud ja pĂŒhendunud turvalisuse parimatele tavadele. Need juhised on globaalselt rakendatavad, kohandatavad erinevatele raamistikele ning hĂ€davajalikud turvaliste ja usaldusvÀÀrsete JavaScripti rakenduste loomiseks.